home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 406_01 / atoc / constant.c < prev    next >
Text File  |  1993-11-09  |  2KB  |  95 lines

  1. /*=========================================================================
  2.  
  3.     ATOC constants module
  4.  
  5. =========================================================================*/
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include "atoc.h"
  10.  
  11.  
  12. /*-------------------------------------------------------------------------
  13. constant( s ) removes or modifies certain ANSI constants that do not exist
  14. in K&R C.
  15. -------------------------------------------------------------------------*/
  16. constant( s )
  17. char *s;
  18. {
  19.     char *cp, temp[ 8 ], *strstr();
  20.     int v, value;
  21.  
  22.     for ( cp = s; ( cp = strstr( cp, "\\?" ) ) != NULL; ++cp )
  23.     {
  24.         *cp = '?';
  25.         strcpy( cp + 1, cp + 2 );
  26.     }
  27.  
  28.     for ( cp = s; ( cp = strstr( cp, "\\x" ) ) != NULL; ++cp )
  29.     {
  30.         /* find value and number of places of hex constant */
  31.         value = 0;
  32.         if ( ( v = hexval( *( cp + 2 ) ) ) != -1 )
  33.         {
  34.             value = v;
  35.             if ( ( v = hexval( *( cp + 3 ) ) ) != -1 )
  36.             {
  37.                 value = value * 16 + v;
  38.                 v = 4;
  39.             }
  40.             else v = 3;
  41.         }
  42.         else v = 2;
  43.  
  44.         /* remove constant */
  45.         strcpy( cp, cp + v );
  46.  
  47.         /* redo value as octal */
  48.         temp[ 0 ] = '\\';
  49.         temp[ 1 ] = ( value >> 6 & 0x03 ) + '0';
  50.         temp[ 2 ] = ( value >> 3 & 0x07 ) + '0';
  51.         temp[ 3 ] = ( value      & 0x07 ) + '0';
  52.         temp[ 4 ] = '\0';
  53.         strins( cp, temp );
  54.     }
  55.  
  56.     for ( cp = s; ( cp = strstr( s, "\\a" ) ) != NULL; ++cp )
  57.     {
  58.         strcpy( cp, cp + 2 );
  59. #ifdef ASCII
  60.         strins( cp, "\\007" );
  61. #endif
  62. #ifdef EBCDIC
  63.         strins( cp, "\\057" );
  64. #endif
  65.     }
  66.  
  67.     for ( cp = s; ( cp = strstr( s, "\\v" ) ) != NULL; ++cp )
  68.     {
  69.         strcpy( cp, cp + 2 );
  70. #ifdef ASCII
  71.         strins( cp, "\\013" );
  72. #endif
  73. #ifdef EBCDIC
  74.         strins( cp, "\\013" );
  75. #endif
  76.     }
  77. }
  78. /*-------------------------------------------------------------------------
  79. hexval( c ) returns the hex digit value of c, or -1 if it's not one.
  80. -------------------------------------------------------------------------*/
  81. PRIVATE int hexval( c )
  82. char c;
  83. {
  84.     static char set[] = { "0123456789ABCDEF" };
  85.     int i;
  86.  
  87.     c = toupper( c );
  88.     for ( i = 0; set[ i ]; ++i )
  89.         if ( c == set[ i ] )
  90.             return( i );
  91.  
  92.     return( -1 );
  93. }
  94. /*=======================================================================*/
  95.